#define _GNU_SOURCE

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/wait.h>

char* my = "hello=123456789";

//./myexec /usr/bin/ls -a -l -n
int main(int argc , char* argv[])
{
    pid_t id = fork();
    if(id == 0)
    {
        printf("我是子进程:%d\n" , getpid());
        //sleep(3);
        //进程替换，去执行ls 命令
        //execl("/usr/bin/ls" , "ls" , "-a", "-l" , NULL);//路径 正常的命令,如果使用了可变参数，最后以NULL结尾
        //char** myargv = &argv[1];
        //execv(myargv[0] , myargv);
        //execvp(myargv[0] , myargv);
        //execlp("ls","ls", "-a" , "-l" , NULL);
        
        //执行我们自己写的程序
        //execl("./mycmd" , "./mycmd");
        //自己创建命令行参数表、环境变量表
        char* const myargv[] = {"mycmd" , NULL};
        //char* const myenv[] = {"hello=2222", "world=100" ,NULL};
        //execvpe("./mycmd" , myargv , myenv);
        
        //使用父进程的环境变量
        extern char** environ;
        //execvpe("./mycmd" , myargv , environ);

        putenv(my);
        execvpe("./mycmd" , myargv , environ);
        //再增加一个打印语句，如果程序替换成功就不会打印，如果打印了程序替换一定失败
        printf("程序替换失败\n");
        exit(1);
    }
    
    //父进程进行等待
    pid_t rid = waitpid(id , NULL ,0);//不关心退出信息，阻塞等待
    if(rid > 0)
    {
        printf("wait : %d success \n" , id);
    }

    return 0;
}
